package com.hh.userservice.controller;

import com.hh.userservice.entity.Order;
import com.hh.userservice.feign.UserOrderFeign;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Date;

@RestController
public class UserController {
    /**
     * 接口是不能做事情的
     * 如果想做事情 必须要有对象
     * 那么这个接口可你当时被创建出代理对象
     * 动态代理 jdk代理 基于 interface 接口 $Proxy 对象 RPC cglib 基于 子类继承
     * jdk 动态代理 只要是代理对象调用的方法必须走invoke方法
     */
    @Resource
    private UserOrderFeign userOrderFeign;

    /**
     * 前端 user-service(userDoOrder)
     * RPC 远程调用 order-service(doOrder)
     * feign 默认等待时间是1秒 超过1s就报错超时
     */
    @GetMapping("/userDoOrder")
    public String userDoOrder() {
        System.out.println("有用户进来了");
        // 这里需要发起一个远程调用
        String s = userOrderFeign.doOrder();
        return s;
    }

    @GetMapping("/testParam")
    public String testParam() {
        String s = userOrderFeign.testUrl("张三", 18);
        System.out.println(s);
        String s1 = userOrderFeign.oneParam("王五");
        System.out.println("s1 = " + s1);
        String s2 = userOrderFeign.twoParam("李四", 31);
        System.out.println("s2 = " + s2);
        Order order = Order.builder()
                .name("牛排")
                .time(new Date())
                .id(1)
                .price(188D)
                .build();
        String s3 = userOrderFeign.oneObj(order);
        System.out.println("s3 = " + s3);
        String s4 = userOrderFeign.oneObjOneParam(order, "赵六");
        System.out.println("s4 = " + s4);
        return "ok";
    }

    /**
     * 不建议 单独传递时间参数
     * 放在对象里面就可以
     * 转成字符串 2022-03-20 10:25:55:213
     * 因为字符串不会改变
     * jdk 8 的时间类型
     * LocalDateTime 会丢失秒和毫秒
     * 改 feign 的源码
     * @return
     */
    @GetMapping("/time")
    public String time() {
        Date date = new Date();
        System.out.println("date = " + date);
        String s = userOrderFeign.testTime(date);
        System.out.println("s = " + s);
        // 年月日
        LocalDate day = LocalDate.now();
        // 时分秒
        LocalDateTime time = LocalDateTime.now();
        return s;
    }
}
